package br.com.sis.rh.action;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.sis.rh.entity.Alocacao;
import br.com.sis.rh.entity.AreaAtuacao;
import br.com.sis.rh.entity.Candidato;
import br.com.sis.rh.entity.Competencia;
import br.com.sis.rh.entity.Endereco;
import br.com.sis.rh.entity.GraduacaoProfissional;
import br.com.sis.rh.entity.PosGraduacaoProfissional;
import br.com.sis.rh.entity.Segmento;
import br.com.sis.rh.entity.Usuario;
import br.com.sis.rh.enums.CamposAbasEnum;
import br.com.sis.rh.facade.CandidatoFacade;
import br.com.sis.rh.facade.UsuarioFacade;
import br.com.sis.rh.util.AvaliacaoAux;
import br.com.sis.rh.util.CandidatoAux;
import br.com.sis.rh.util.ExpectativaProfissionalAux;
import br.com.sis.rh.util.HistoricoProfissionalAux;
import br.com.sis.rh.vo.RetornoAjaxVO;

@Controller
@Scope("request")
@ParentPackage("json-default")
@Namespace(value = "/")
public class CandidatoAction extends ComumAuxAction implements ComumAction {
	
	@Autowired
	private CandidatoFacade candidatoFacade;
	
	@Autowired
	private UsuarioFacade usuarioFacade;
	
	@Autowired
	private CandidatoAux candidatoAux;
	
	@Autowired
	private HistoricoProfissionalAux historicoProfissionalAux;
	
	@Autowired
	private ExpectativaProfissionalAux expectativaProfissionalAux;	
	
	@Autowired
	private AvaliacaoAux avaliacaoAux;
	
	private Candidato candidato;
	private Endereco endereco;
	private Alocacao alocacao;

	private GraduacaoProfissional graduacaoProfissional;
	private PosGraduacaoProfissional posGraduacaoProfissional;
	
	private RetornoAjaxVO retornoAjax;
	
	private String cursoExtra;
	
	private Usuario usuario;
	
	private Candidato candidatoFiltro;
	
	private String campoBuscaGeral;
	
	private List<Integer> comboAreaAtuacaoSelecionada;
	
	private List<Integer> comboSegmentoSelecionado;
	
	private List<Integer> comboCompetenciaSelecionada;
	
	@Override
	@Action(value="incluirCandidato", results={
			@Result(name="success", type="json", params={"root","retornoAjax"})
	})
	public String incluir() {

		retornoAjax = new RetornoAjaxVO();
		
		Usuario usuario = new Usuario();
		
		usuario.setId(1);
		
		candidato.setUsuario(usuario);
		
		candidatoFacade.incluir(candidato);
		
		candidato.setPorcentagemPreenchidaDadosGerais(calculaPorcentagemPreenchida(CamposAbasEnum.TOTAL_CAMPOS_CANDIDATO.getQuantidadeCampos(), candidatoAux.atributosPreenchidos(candidato)));
		
		retornoAjax.setObjetoRetornado(candidato);
		retornoAjax.setStatusOperacao(SUCCESS);
		
		return SUCCESS;
	}
	
	@Override
	@Action(value="alterarCandidato", results={
			@Result(name="success", type="json", params={"root","retornoAjax"})
	})
	public String alterar() {
		
		retornoAjax = new RetornoAjaxVO();
		
		candidatoFacade.alterar(candidato);

		retornoAjax.setStatusOperacao(SUCCESS);

		retornoAjax.setObjetoRetornado(calculaPorcentagemPreenchida(CamposAbasEnum.TOTAL_CAMPOS_CANDIDATO.getQuantidadeCampos(), candidatoAux.atributosPreenchidos(candidato)));
		
		return SUCCESS;
	}

	@Override
	public String excluir() {
		return null;
	}

	@Override
	public String listar() {
		return null;
	}

	@Action(value="listarCandidatosUsuario", results={
			@Result(name="success", type="json", params={"root","retornoAjax"})
	})
	public String listarCandidatosUsuario() {
		retornoAjax = new RetornoAjaxVO();
		
		Usuario usuarioRetornado = usuarioFacade.recuperarObjetoPorID(usuario);
		
		List<Candidato> lista = new ArrayList<>(usuarioRetornado.getCandidato());
		
		Collections.sort(lista, new Comparator<Candidato>() {
			public int compare(Candidato c1, Candidato c2){
				return c2.getDataAtualizacao().compareTo(c1.getDataAtualizacao());
			}
		});
		
		retornoAjax.setObjetoRetornado(lista);
		
		retornoAjax.setStatusOperacao(SUCCESS);
		
		return SUCCESS;
	}
	
	@Action(value="listarCandidatosHS", results={
			@Result(name="success", type="json", params={"root","retornoAjax"})
	})
	public String listarCandidatosHS() {
		retornoAjax = new RetornoAjaxVO();
		
		List<Candidato> listaCandidato = candidatoFacade.consultaBasica(candidato, campoBuscaGeral);
		
		retornoAjax.setObjetoRetornado(new HashSet<Candidato>(listaCandidato));
		
		return SUCCESS;
	}
	
	@Action(value="carregarCandidato", results={
			@Result(name="success", location="/WEB-INF/pages/candidato.jsp")
	})
	public String carregarCandidato() {
		candidato = candidatoFacade.recuperarObjetoPorID(candidatoFiltro);
		
		candidato.setPorcentagemPreenchidaDadosGerais(calculaPorcentagemPreenchida(CamposAbasEnum.TOTAL_CAMPOS_CANDIDATO.getQuantidadeCampos(), candidatoAux.atributosPreenchidos(candidato)));
		candidato.setPorcentagemPreenchidaHistorico(calculaPorcentagemPreenchida(CamposAbasEnum.TOTAL_CAMPOS_HISTORICO.getQuantidadeCampos(), historicoProfissionalAux.atributosPreenchidos(candidato)));
		candidato.setPorcentagemPreenchidaExpectativa(calculaPorcentagemPreenchida(CamposAbasEnum.TOTAL_CAMPOS_EXPECTATIVA.getQuantidadeCampos(), expectativaProfissionalAux.atributosPreenchidos(candidato)));
		candidato.setPorcentagemPreenchidaAvaliacao(calculaPorcentagemPreenchida(CamposAbasEnum.TOTAL_CAMPOS_AVALIACAO.getQuantidadeCampos(), avaliacaoAux.atributosPreenchidos(candidato)));
		
		carregaComboAreaAtuacao();
		
		carregaComboSegmento();
		
		carregaComboCompetencia();
		
		montaListaSelecionadaAreaAtuacao();
		
		montaListaSelecionadaSegmento();
		
		montaListaSelecionadaCompetencia();
		
		return SUCCESS;
	}
	
	@Action(value="telaInclusao", results={
			@Result(name="success", location="/WEB-INF/pages/candidato.jsp")
	})
	public String telaInclusao() {
		carregaComboAreaAtuacao();
		
		carregaComboSegmento();
		
		carregaComboCompetencia();
		
		return SUCCESS;
	}
	
	private void montaListaSelecionadaAreaAtuacao() {
		
		comboAreaAtuacaoSelecionada = new ArrayList<Integer>();
		
		for(AreaAtuacao area : candidato.getAreaAtuacao()) {
			comboAreaAtuacaoSelecionada.add(area.getId());
		}
	}
	
	private void montaListaSelecionadaSegmento() {
		
		comboSegmentoSelecionado = new ArrayList<Integer>();
		
		for(Segmento segmento : candidato.getSegmento()) {
			comboSegmentoSelecionado.add(segmento.getId());
		}
	}
	
	private void montaListaSelecionadaCompetencia() {
		comboCompetenciaSelecionada = new ArrayList<Integer>();
		
		if(candidato.getAvaliacao() != null) {
			for(Competencia competencia : candidato.getAvaliacao().getCompetencia()) {
				comboCompetenciaSelecionada.add(competencia.getId());
			}
		}
	}
	
	public Candidato getCandidato() {
		return candidato;
	}

	public void setCandidato(Candidato candidato) {
		this.candidato = candidato;
	}

	public RetornoAjaxVO getRetornoAjax() {
		return retornoAjax;
	}

	public void setRetornoAjax(RetornoAjaxVO retornoAjax) {
		this.retornoAjax = retornoAjax;
	}

	public CandidatoFacade getCandidatoFacade() {
		return candidatoFacade;
	}

	public void setCandidatoFacade(CandidatoFacade candidatoFacade) {
		this.candidatoFacade = candidatoFacade;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public Alocacao getAlocacao() {
		return alocacao;
	}

	public void setAlocacao(Alocacao alocacao) {
		this.alocacao = alocacao;
	}

	public String getCursoExtra() {
		return cursoExtra;
	}

	public void setCursoExtra(String cursoExtra) {
		this.cursoExtra = cursoExtra;
	}

	public GraduacaoProfissional getGraduacaoProfissional() {
		return graduacaoProfissional;
	}

	public void setGraduacaoProfissional(GraduacaoProfissional graduacaoProfissional) {
		this.graduacaoProfissional = graduacaoProfissional;
	}

	public PosGraduacaoProfissional getPosGraduacaoProfissional() {
		return posGraduacaoProfissional;
	}

	public void setPosGraduacaoProfissional(
			PosGraduacaoProfissional posGraduacaoProfissional) {
		this.posGraduacaoProfissional = posGraduacaoProfissional;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Candidato getCandidatoFiltro() {
		return candidatoFiltro;
	}

	public void setCandidatoFiltro(Candidato candidatoFiltro) {
		this.candidatoFiltro = candidatoFiltro;
	}

	public String getCampoBuscaGeral() {
		return campoBuscaGeral;
	}

	public void setCampoBuscaGeral(String campoBuscaGeral) {
		this.campoBuscaGeral = campoBuscaGeral;
	}

	public List<Integer> getComboAreaAtuacaoSelecionada() {
		return comboAreaAtuacaoSelecionada;
	}

	public void setComboAreaAtuacaoSelecionada(
			List<Integer> comboAreaAtuacaoSelecionada) {
		this.comboAreaAtuacaoSelecionada = comboAreaAtuacaoSelecionada;
	}

	public List<Integer> getComboSegmentoSelecionado() {
		return comboSegmentoSelecionado;
	}

	public void setComboSegmentoSelecionado(List<Integer> comboSegmentoSelecionado) {
		this.comboSegmentoSelecionado = comboSegmentoSelecionado;
	}

	public List<Integer> getComboCompetenciaSelecionada() {
		return comboCompetenciaSelecionada;
	}

	public void setComboCompetenciaSelecionada(
			List<Integer> comboCompetenciaSelecionada) {
		this.comboCompetenciaSelecionada = comboCompetenciaSelecionada;
	}

}
